package com.example.springboottest.example.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 注解都是通过反射方式获取信息的
 * 1、Retention
 * RetentionPolicy.CLASS: 编译器将把注解记录在 class 文件中 当运行Java程序时,JVM不可获取注解信息 这是默认值
 * RetentionPolicy.RUNTIME: 编译器将把注解记录在 class 文件中 当运行Java程序时,JVM也可获取注解信息 程序可以通过反射获取该注解信息
 * RetentionPolicy.SOURCE: 注解只保留在源代码中，编译器直接丢弃这种注解
 * <p>
 * 2、Target
 * ElementType.ANNOTATION_TYPE: 指定该策略的注解只能修饰注解。
 * ElementType.CONSTRUCTOR: 指定该策略的注解只能修饰构造器。
 * ElementType.FIELD: 指定该策略的注解只能修饰成员变量。
 * ElementType.LOCAL_VARIABLE: 指定该策略的注解只能修饰局部变量
 * ElementType.METHOD: 指定该策略的注解只能修饰方法定义。
 * ElementType.PACKAGE: 指定该策略的注解只能修饰包定义
 * ElementType.PARAMETER: 指定该策略 注解可 修饰参数
 * ElementType.TYPE: 指定该策略的注解可以修饰类、接口(包括注解类型)或枚举定义
 * <p>
 * 3、Documented
 * 用于指定被该元注解修饰的注解类将被 javadoc 工具提取成文档
 * <p>
 * 4、Inherited
 * 指定被它修饰 注解将具有继承性
 */

@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.TYPE)
public @interface MyTag {
    // 定义了两个成员变量的注解
    //使 default 为两个成员变量指定初始值
    String name() default "yeeku";

    int age() default 32;
}
